package com.ztesoft.web.baseconfig.db.dao;

import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.annotation.Resource;

import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;

import com.ztesoft.core.common.Page;
import com.ztesoft.framework.exception.SysRuntimeException;
import com.ztesoft.framework.util.StringUtils;
import com.ztesoft.web.baseconfig.db.arg.SubTableDefineArg;
import com.ztesoft.web.baseconfig.db.arg.SubTableDefineArg.SubTableDefineCriteria;
import com.ztesoft.web.baseconfig.db.dao.mapper.ISubTableDefineMapper;
import com.ztesoft.web.baseconfig.db.po.SubTableDefinePO;
import com.ztesoft.web.baseconfig.db.po.TableNamePO;

@Repository
@Scope("prototype")
public class SubTableDefineDao extends SqlSessionDaoSupport {

	@Resource(name = "majorSqlSessionTemplate")
	public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
		super.setSqlSessionTemplate(sqlSessionTemplate);
	}

	public List<Integer> countByArg(SubTableDefineArg arg) {
		return getMapper().countByArg(arg);
	}

	public int deleteByArg(SubTableDefineArg arg) {
		return getMapper().deleteByArg(arg);
	}

	public List<SubTableDefinePO> selectByArg(SubTableDefineArg arg) {
		return getMapper().selectByArg(arg);
	}

	public List<SubTableDefinePO> selectBySourceDataId(SubTableDefinePO record) {
		return getMapper().selectBySourceDataId(record);
	}

	public int updateByArgSelective(SubTableDefinePO record, SubTableDefineArg arg) {
		return getMapper().updateByArgSelective(record, arg);
	}

	public int updateDToA(Integer id) {
		return getMapper().updateDToA(id);
	}
	public int updateTo00X(Integer id) {
		return getMapper().updateTo00X(id);
	}

	public int updateByArg(SubTableDefinePO record, SubTableDefineArg arg) {
		return getMapper().updateByArg(record, arg);
	}

	public Page<SubTableDefinePO> selectByArgAndPage(SubTableDefineArg arg, Page<SubTableDefinePO> resultPage) {
		List<SubTableDefinePO> resultList = getMapper().selectByArgAndPage(arg, resultPage);
		resultPage.setResultList(resultList);
		return resultPage;
	}

	public int insert(SubTableDefinePO record) {
		return getMapper().insert(record);
	}

	public int insertSelective(SubTableDefinePO record) {
		return getMapper().insertSelective(record);
	}

	public int insertBatch(List<SubTableDefinePO> records) {
		return getMapper().insertBatch(records);
	}

	public int deleteByPrimaryKey(Integer key) {
		return getMapper().deleteByPrimaryKey(key);
	}

	public SubTableDefinePO selectByPrimaryKey(Integer key) {
		return getMapper().selectByPrimaryKey(key);
	}

	public List<TableNamePO> selectByTableName(SubTableDefinePO po) {
		return getMapper().selectByTableName(po);
	}

	/**
	 * 根据数据ID获取分表定义，分表、目标表
	 * 
	 * @param po
	 * @return
	 */
	public List<TableNamePO> selectBySourceDataIdForSubAndTgt(SubTableDefinePO po) {
		return getMapper().selectBySourceDataIdForSubAndTgt(po);
	}

	/**
	 * 根据数据ID获取分表定义，主源表
	 * 
	 * @param po
	 * @return
	 */
	public List<TableNamePO> selectBySourceDataIdForSrc(SubTableDefinePO po) {
		return getMapper().selectBySourceDataIdForSrc(po);
	}

	public int updateByPrimaryKeySelective(SubTableDefinePO record) {
		return getMapper().updateByPrimaryKeySelective(record);
	}

	public int updateByPrimaryKey(SubTableDefinePO record) {
		return getMapper().updateByPrimaryKey(record);
	}

	/**
	 * 根据传入的Map条件进行查询，当前仅支持所有Map中Key字段的EqualTo查询
	 * 
	 * @param params
	 *            Map,Key=字段名，value=查询值
	 * @return
	 */
	public List<SubTableDefinePO> selectByMap(Map<String, Object> params) {
		return (selectByArg(buildQueryObject(params)));
	}

	private SubTableDefineArg buildQueryObject(Map<String, Object> params) {

		SubTableDefineArg arg = new SubTableDefineArg();
		SubTableDefineCriteria criteria = arg.createCriteria();

		Class criteriaClass = criteria.getClass();
		Set keys = params.keySet();

		if (keys != null) {

			Iterator iterator = keys.iterator();

			while (iterator.hasNext()) {

				Object key = iterator.next();
				Object value = params.get(key);
				for (Method method : criteriaClass.getMethods()) {
					if (method.getName().equals("and" + StringUtils.toUpperCaseFirstOne(key.toString()) + "EqualTo")) {
						try {
							method.invoke(criteria, value);
						} catch (Exception e) {
							throw new SysRuntimeException(e);
						}
						break;
					}
				}
			}
		}
		return arg;
	}

	public ISubTableDefineMapper getMapper() {
		return getSqlSession().getMapper(ISubTableDefineMapper.class);
	}

}
